![]() | PROGRAMACIÓN ORIENTADA A RESTRICCIONES |
![]() |
Una de las soluciones del problema de las 8 reinas |
(i1 … i8)
, en donde ij
es la columna ocupada por la reina de la fila j
, la expresión de la solución, junto con las restricciones, es la siguiente:
s = {〈([i[1…8]]) ← ij≠ik ← j≠k ← (abs(ij−ik) ≠ abs(j−k))
← j≥1 ← j≤8 ← k≥1 ← k≤8 〉}
(2 4 5 8 3 1 7 5)
.
ij≠ik ← j≠k
es la no pertenencia a la misma fila.
abs(ij−ik) ≠ abs(j−k)
es la no pertenencia a la misma diagonal. Cuando dos reinas están en una misma diagonal, la diferencia (en valor absoluto) entre sus respectivas filas es igual a la diferencia (en valor absoluto) entre sus respectivas columnas.
abs
es el valor absoluto de un número entero:
〈( abs(m) = (−m ← m<0 →' m) )〉 // m indica número entero
n
reinas es:
〈( s(n) = {〈([i⌊1…n⌋]) ← ij≠ik ← j≠k ← (abs(ij−ik) ≠ abs(j−k))
← j≥1 ← j≤n ← k≥1 ← k≤n 〉} )〉
n=2
y n=3
.
n=4
tiene una única solución: (2 4 1 3)
.
![]() |
La única solución del problema de las 4 reinas |
( CondCol =: (ij≠ik ← j≠k) ) // condición de distinta columna
( CondDiag =: (abs(ij−ik) ≠ abs(j−k)) ) // condición de distinta diagonal
( CondGen =: (j≥1 ← j≤n ← k≥1 ← k≤n) ) // condición general
〈( s(n) = {〈([i⌊1…n⌋]) ← CondCol ← CondDiag ← CondGen〉} )〉